#pragma once
#include "noncopyable.h"
#include "Thread.h"
#include <functional>
#include <mutex>
#include <condition_variable>
#include <string>

class Eventloop;

class EventloopThread : noncopyable
{
public:
    using ThreadInitCallback = std::function<void(Eventloop*)>;

    EventloopThread(const ThreadInitCallback &cb = ThreadInitCallback(),
                    const std::string &name = std::string());
    ~EventloopThread();

    Eventloop* startLoop();

private:
    void threadFunc();
    
    Eventloop *loop_;           // 指向线程内的 EventLoop
    bool exiting_;              // 标记是否正在退出
    Thread thread_;             // 封装的实际线程对象
    std::mutex mutex_;          // 保护 loop_ 的访问
    std::condition_variable cond_; // 用于等待 EventLoop 创建完成
    ThreadInitCallback callback_;   // 用户提供的初始化回调
};